#include <stdio.h>
#include "sgp30.h"
#include "iic.h"
#include "delay.h"
 
void SGP30_Write(u8 a, u8 b)
{
  IIC_Start();
  IIC_Send_Byte(SGP30_write); //发送器件地址+写指令
  IIC_Wait_Ack();
  IIC_Send_Byte(a);		//发送控制字节
  IIC_Wait_Ack();
  IIC_Send_Byte(b);
  IIC_Wait_Ack();
  IIC_Stop();
  delay_ms(100);
}
 
u32 SGP30_Read(void)
{
  u32 dat;
  u8 crc;
  IIC_Start();
  IIC_Send_Byte(SGP30_read); //发送器件地址+读指令
  IIC_Wait_Ack();
  dat = IIC_Read_Byte(1);
  dat <<= 8;
  dat += IIC_Read_Byte(1);
  crc = IIC_Read_Byte(1); //crc数据，舍去
  crc = crc;  //为了不让出现编译警告
  dat <<= 8;
  dat += IIC_Read_Byte(1);
  dat <<= 8;
  dat += IIC_Read_Byte(0);
  IIC_Stop();
  return(dat);
}

//初始化IIC接口
void SGP30_Init(void)
{
	IIC_Init();
  SGP30_Write(0x20, 0x03);
//	SGP30_Write(0x20,0x61);
//	SGP30_Write(0x01,0x00);
	SGP30_Start();
}
 
void SGP30_Start(void)
{
	u32 CO2Data,TVOCData;
	u32 sgp30_dat;
	delay_ms(100);
	SGP30_Write(0x20,0x08);
	sgp30_dat = SGP30_Read();//读取SGP30的值
	CO2Data = (sgp30_dat & 0xffff0000) >> 16;
	TVOCData = sgp30_dat & 0x0000ffff;	
	//SGP30模块开机需要一定时间初始化，在初始化阶段读取的CO2浓度为400ppm，TVOC为0ppd且恒定不变，因此上电后每隔一段时间读取一次
	//SGP30模块的值，如果CO2浓度为400ppm，TVOC为0ppd，发送“正在检测中...”，直到SGP30模块初始化完成。
	//初始化完成后刚开始读出数据会波动比较大，属于正常现象，一段时间后会逐渐趋于稳定。
	//气体类传感器比较容易受环境影响，测量数据出现波动是正常的，可自行添加滤波函数。
	while(CO2Data == 400 && TVOCData == 0)
	{
		SGP30_Write(0x20,0x08);
		sgp30_dat = SGP30_Read();//读取SGP30的值
		CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
		TVOCData = sgp30_dat & 0x0000ffff;			 //取出TVOC值
		printf("waiting\t\n");
		delay_ms(500);
	}
}

void sgp_read(u32 *co2, u32 *tvoc)
{
	u32 sgp30_dat;
	SGP30_Write(0x20,0x08);
	sgp30_dat = SGP30_Read();										
	*co2 = (sgp30_dat & 0xffff0000) >> 16;		
	*tvoc = sgp30_dat & 0x0000ffff;       		
}
